package com.ethink.warehouse.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ethink.framework.common.constant.CommonRespCode;
import com.ethink.framework.common.exception.BusinessException;
import com.ethink.framework.common.web.context.SPRequestContextHolder;
import com.ethink.id.generator.IdGenerator;
import com.ethink.warehouse.api.enums.MateInventorySaleChannelChangeLogOrderStatusEnum;
import com.ethink.warehouse.api.enums.MateInventoryTypeChangeLogOrderStatusEnum;
import com.ethink.warehouse.api.info.MateInventorySaleChannelChangeLogInfo;
import com.ethink.warehouse.api.info.MateInventoryTypeChangeLogModeInfo;
import com.ethink.warehouse.api.request.*;
import com.ethink.warehouse.api.response.*;
import com.ethink.warehouse.common.entity.MateInventorySaleChannelChangeLog;
import com.ethink.warehouse.common.entity.MateInventorySaleChannelChangeLogDetail;
import com.ethink.warehouse.common.entity.MateInventoryTypeChangeLogDetail;
import com.ethink.warehouse.common.mapper.MateInventoryTypeChangeLogDetailMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ethink.framework.common.db.PageUtils;
import com.ethink.warehouse.api.info.MateInventoryTypeChangeLogInfo;
import com.ethink.warehouse.common.entity.MateInventoryTypeChangeLog;
import com.ethink.warehouse.common.mapper.MateInventoryTypeChangeLogMapper;
import com.ethink.warehouse.converter.MateInventoryTypeChangeLogConverter;
import com.ethink.warehouse.service.MateInventoryTypeChangeLogService;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;

/**
 * 库存状态变更 Service接口实现
 *
 * @author default
 * @date 2023-01-14
 */
@Slf4j
@Service
public class MateInventoryTypeChangeLogServiceImpl implements MateInventoryTypeChangeLogService {

    @Autowired
    private MateInventoryTypeChangeLogMapper mateInventoryTypeChangeLogMapper;

    @Autowired
    private MateInventoryTypeChangeLogDetailMapper mateInventoryTypeChangeLogDetailMapper;

    @Autowired
    private MateInventoryTypeChangeLogConverter mateInventoryTypeChangeLogConverter;

    @Autowired
    private IdGenerator idGenerator;

    @Override
    public Page<MateInventoryTypeChangeLogInfo> queryMateInventoryTypeChangeLog(MateInventoryTypeChangeLogQueryRequest request) {
        return mateInventoryTypeChangeLogMapper.queryMateInventoryTypeChangeLog(PageUtils.buildPage(request), request);
    }

    @Override
    public MateInventoryTypeChangeLogGetDetailResponse getMateInventoryTypeChangeLogById(Long id) {
        MateInventoryTypeChangeLogGetDetailResponse response = new MateInventoryTypeChangeLogGetDetailResponse();
        MateInventoryTypeChangeLogInfo main = mateInventoryTypeChangeLogMapper.getMateInventoryTypeChangeLogById(id);
        response.setMain(main);
        response.setItems(mateInventoryTypeChangeLogDetailMapper.queryByOrderNo(main.getOrderNo()));
        return response;
    }

    @Override
    public List<MateInventoryTypeChangeLogInfo> listMateInventoryTypeChangeLog(MateInventoryTypeChangeLogQueryRequest request) {
        return mateInventoryTypeChangeLogMapper.listMateInventoryTypeChangeLog(request);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public MateInventoryTypeChangeLogAddResponse addMateInventoryTypeChangeLog(MateInventoryTypeChangeLogAddRequest request) {
        MateInventoryTypeChangeLogAddResponse response = new MateInventoryTypeChangeLogAddResponse();
        MateInventoryTypeChangeLog main = new MateInventoryTypeChangeLog();
        BeanUtils.copyProperties(request, main);
        main.setOrderNo(idGenerator.kcztbg());
        mateInventoryTypeChangeLogMapper.insert(main);
        for (MateInventoryTypeChangeLogAddItemRequest item : request.getItems()) {
            MateInventoryTypeChangeLogDetail detail = new MateInventoryTypeChangeLogDetail();
            detail.setOrderNo(main.getOrderNo());
            detail.setBeforeMateInventoryId(item.getBeforeMateInventoryId());
            detail.setQty(item.getQty());
            mateInventoryTypeChangeLogDetailMapper.insert(detail);
        }
        response.setId(main.getId());
        return response;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public MateInventoryTypeChangeLogUpdateResponse updateMateInventoryTypeChangeLog(MateInventoryTypeChangeLogUpdateRequest request) {
        MateInventoryTypeChangeLogUpdateResponse response = new MateInventoryTypeChangeLogUpdateResponse();
        MateInventoryTypeChangeLog main = mateInventoryTypeChangeLogMapper.selectById(request.getId());
        if (!MateInventoryTypeChangeLogOrderStatusEnum.S1.eq(main.getOrderStatus())) {
            throw new BusinessException(CommonRespCode.SYSTEM_ERR, "当前订单状态无法编辑");
        }
        LambdaUpdateWrapper<MateInventoryTypeChangeLog> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MateInventoryTypeChangeLog::getId, request.getId());
        updateWrapper.set(MateInventoryTypeChangeLog::getOrderStatus, request.getOrderStatus());
        updateWrapper.set(MateInventoryTypeChangeLog::getSubWarehouseCode, request.getSubWarehouseCode());
        updateWrapper.set(MateInventoryTypeChangeLog::getSaleSubChannel, request.getSaleSubChannel());
        updateWrapper.set(MateInventoryTypeChangeLog::getChangeType, request.getChangeType());
        updateWrapper.set(MateInventoryTypeChangeLog::getRemark, request.getRemark());
        mateInventoryTypeChangeLogMapper.update(null, updateWrapper);
        mateInventoryTypeChangeLogDetailMapper.delete(new LambdaQueryWrapper<MateInventoryTypeChangeLogDetail>()
                .eq(MateInventoryTypeChangeLogDetail::getOrderNo, main.getOrderNo())
        );
        for (MateInventoryTypeChangeLogAddItemRequest item : request.getItems()) {
            MateInventoryTypeChangeLogDetail detail = new MateInventoryTypeChangeLogDetail();
            detail.setOrderNo(main.getOrderNo());
            detail.setBeforeMateInventoryId(item.getBeforeMateInventoryId());
            detail.setQty(item.getQty());
            mateInventoryTypeChangeLogDetailMapper.insert(detail);
        }
        response.setId(main.getId());
        return response;
    }

    @Override
    public MateInventoryTypeChangeLogDeleteResponse deleteMateInventoryTypeChangeLog(Long id) {
        MateInventoryTypeChangeLogDeleteResponse response = new MateInventoryTypeChangeLogDeleteResponse();
        MateInventoryTypeChangeLog main = mateInventoryTypeChangeLogMapper.selectById(id);
        LambdaUpdateWrapper<MateInventoryTypeChangeLog> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MateInventoryTypeChangeLog::getId, id);
        updateWrapper.set(MateInventoryTypeChangeLog::getIsDeleted, true);
        mateInventoryTypeChangeLogMapper.update(null, updateWrapper);
        mateInventoryTypeChangeLogDetailMapper.update(null,
                new LambdaUpdateWrapper<MateInventoryTypeChangeLogDetail>()
                        .eq(MateInventoryTypeChangeLogDetail::getOrderNo, main.getOrderNo())
                        .set(MateInventoryTypeChangeLogDetail::getIsDeleted, true)
        );
        response.setId(main.getId());
        return response;
    }

    @Override
    public void setOrderStatus(Long id, Integer orderStatus) {
        LambdaUpdateWrapper<MateInventoryTypeChangeLog> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(MateInventoryTypeChangeLog::getId, id);
        updateWrapper.set(MateInventoryTypeChangeLog::getOrderStatus, orderStatus)
                .set(MateInventoryTypeChangeLog::getAuditUserCode, SPRequestContextHolder.getCurrentSystemUserLoginName())
                .set(MateInventoryTypeChangeLog::getAuditUserName, SPRequestContextHolder.getCurrentSystemUserRealName());
        mateInventoryTypeChangeLogMapper.update(null, updateWrapper);
    }

    @Override
    public Page<MateInventoryTypeChangeLogModeInfo> queryMateInventoryTypeChangeLogMode(MateInventoryTypeChangeLogQueryModeRequest request) {
        return mateInventoryTypeChangeLogMapper.queryMateInventoryTypeChangeLogMode(PageUtils.buildPage(request), request);
    }

}
